package jp.co.nes.awssupport.common.bean;

import java.math.BigDecimal;
import java.time.ZonedDateTime;
import java.util.List;

import org.apache.commons.lang3.builder.ReflectionToStringBuilder;

import com.fasterxml.jackson.annotation.JsonIgnore;

/**
 * 契約情報です。
 */
public class ContractInformationBean extends BaseBean {

    /** serialVersionUID */
    private static final long serialVersionUID = 1L;

    /** ID */
    private String id;

    /** 連結アカウントID */
    private String linkedAccountId;

    /** 請求書送付先短縮部門名 */
    private String billingPersonDepartmentShortName;

    /** 請求先住所(市区郡) */
    private String billingPersonCity;

    /** 請求先住所(町名・番地) */
    private String billingPersonStreet;

    /** 請求先住所(都道府県) */
    private String billingPersonState;

    /** 請求先住所(郵便番号) */
    private String billingPersonPostalCode;

    /** 請求先担当者メール */
    private String billingPersonEmail;

    /** 請求先担当者会社 */
    private String billingPersonCompany;

    /** 請求先担当者部署 */
    private String billingPersonDepartment;

    /** 請求先担当者役職 */
    private String billingPersonTitle;

    /** 請求先担当者名 */
    private String billingPersonName;

    /** ボリューミンググループID */
    private String volumingGroupId;

    /** 料金グループID */
    private String pricingGroupId;

    /** 料金グループ料金名 */
    private String pricingGroupName;

    /** キャンペーングループリスト */
    private List<CampaignGroupBean> campaignGroupList;

    /** 雑費グループ */
    private MiscellaneousExpensesGroupBean miscellaneousExpensesGroupBean;

    /** 税金グループ */
    private TaxGroupBean taxGroupBean;

    /** クレジットリスト */
    private List<CreditCouponBean> creditCouponList;

    /** 為替レート */
    private ExchangeRateBean exchangeRateBean;

    /** 利用実績 */
    private UsageHistoryBean usageHistoryBean;

    /** APIIAMユーザ */
    private IamUserBean apiIamUser;

    /** 契約番号 */
    private String contractNumber;

    /** アカウント名プレフィックス */
    private String accountNamePrefix;

    /** 用途 */
    private String usage;

    /** サプリセール */
    private String subResale2;

    /** サポートプラン */
    private String supportPlan;

    /** CloudTrail利用フラグ */
    private boolean awsCloudTrail;

    /** RootアカウントMFA利用フラグ */
    private boolean rootMFA;

    /** TrustedAdvisorセキュリティ監査利用フラグ */
    private boolean trustedAdvisorSecurityCheck;

    /** VPCフローログ利用フラグ */
    private boolean vpcFlowLogs;

    /** AWSConfig利用フラグ */
    private boolean awsConfig;

    /** 契約責任者ユーザ情報 */
    private ContactBean contractPersonBean;

    /** 契約責任者会社名 */
    private String contractPersonCompany;

    /** 問合せ担当者ユーザ情報 */
    private ContactBean contactPersonBean;

    /** 問合せ担当者会社名 */
    private String contactPersonCompany;

    /** 請求明細送付先ユーザ情報 */
    private ContactBean billingPersonBean;

    /** 為替レート */
    private String fixedRate;

    /** その他連絡先リスト */
    private List<OtherContactBean> otherContact;

    /** 要Excel明細 */
    private boolean needExcelBilling;

    /** 契約開始日 */
    private ZonedDateTime startDate;

    /** 解約日 */
    private ZonedDateTime cancelDate;

    /**
     * デフォルトコンストラクタです。
     */
    public ContractInformationBean() {
    }

    /**
     * IDを返却します。
     *
     * @return ID
     */
    public String getId() {
        return id;
    }

    /**
     * IDを設定します。
     *
     * @param id ID
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * 連結アカウントIDを返却します。
     *
     * @return 連結アカウントID
     */
    public String getLinkedAccountId() {
        return linkedAccountId;
    }

    /**
     * 連結アカウントIDを設定します。
     *
     * @param linkedAccountId 連結アカウントID
     */
    public void setLinkedAccountId(String linkedAccountId) {
        this.linkedAccountId = linkedAccountId;
    }

    /**
     * 請求書送付先短縮部門名を返却します。
     *
     * @return 請求書送付先短縮部門名
     */
    public String getBillingPersonDepartmentShortName() {
        return billingPersonDepartmentShortName;
    }

    /**
     * 請求書送付先短縮部門名を設定します。
     *
     * @param billingPersonDepartmentShortName 請求書送付先短縮部門名
     */
    public void setBillingPersonDepartmentShortName(String billingPersonDepartmentShortName) {
        this.billingPersonDepartmentShortName = billingPersonDepartmentShortName;
    }

    /**
     * 請求先住所(市区郡)を返却します。
     *
     * @return 請求先住所(市区郡)
     */
    public String getBillingPersonCity() {
        return billingPersonCity;
    }

    /**
     * 請求先住所(市区郡)を設定します。
     *
     * @param billingPersonCity 請求先住所(市区郡)
     */
    public void setBillingPersonCity(String billingPersonCity) {
        this.billingPersonCity = billingPersonCity;
    }

    /**
     * 請求先住所(町名・番地)を返却します。
     *
     * @return 請求先住所(町名・番地)
     */
    public String getBillingPersonStreet() {
        return billingPersonStreet;
    }

    /**
     * 請求先住所(町名・番地)を設定します。
     *
     * @param billingPersonStreet 請求先住所(町名・番地)
     */
    public void setBillingPersonStreet(String billingPersonStreet) {
        this.billingPersonStreet = billingPersonStreet;
    }

    /**
     * 請求先住所(都道府県)を返却します。
     *
     * @return 請求先住所(都道府県)
     */
    public String getBillingPersonState() {
        return billingPersonState;
    }

    /**
     * 請求先住所(都道府県)を設定します。
     *
     * @param billingPersonState 請求先住所(都道府県)
     */
    public void setBillingPersonState(String billingPersonState) {
        this.billingPersonState = billingPersonState;
    }

    /**
     * 請求先住所(郵便番号)を返却します。
     *
     * @return 請求先住所(郵便番号)
     */
    public String getBillingPersonPostalCode() {
        return billingPersonPostalCode;
    }

    /**
     * 請求先住所(郵便番号)を設定します。
     *
     * @param billingPersonPostalCode 請求先住所(郵便番号)
     */
    public void setBillingPersonPostalCode(String billingPersonPostalCode) {
        this.billingPersonPostalCode = billingPersonPostalCode;
    }

    /**
     * 請求先担当者メールを返却します。
     *
     * @return 請求先担当者メール
     */
    public String getBillingPersonEmail() {
        return billingPersonEmail;
    }

    /**
     * 請求先担当者メールを設定します。
     *
     * @param billingPersonEmail 請求先担当者メール
     */
    public void setBillingPersonEmail(String billingPersonEmail) {
        this.billingPersonEmail = billingPersonEmail;
    }

    /**
     * 請求先担当者会社を返却します。
     *
     * @return 請求先担当者会社
     */
    public String getBillingPersonCompany() {
        return billingPersonCompany;
    }

    /**
     * 請求先担当者会社を設定します。
     *
     * @param billingPersonCompany 請求先担当者会社
     */
    public void setBillingPersonCompany(String billingPersonCompany) {
        this.billingPersonCompany = billingPersonCompany;
    }

    /**
     * 請求先担当者部署を返却します。
     *
     * @return 請求先担当者部署
     */
    public String getBillingPersonDepartment() {
        return billingPersonDepartment;
    }

    /**
     * 請求先担当者部署を設定します。
     *
     * @param billingPersonDepartment 請求先担当者部署
     */
    public void setBillingPersonDepartment(String billingPersonDepartment) {
        this.billingPersonDepartment = billingPersonDepartment;
    }

    /**
     * 請求先担当者役職を返却します。
     *
     * @return 請求先担当者役職
     */
    public String getBillingPersonTitle() {
        return billingPersonTitle;
    }

    /**
     * 請求先担当者役職を設定します。
     *
     * @param billingPersonTitle 請求先担当者役職
     */
    public void setBillingPersonTitle(String billingPersonTitle) {
        this.billingPersonTitle = billingPersonTitle;
    }

    /**
     * 請求先担当者名を返却します。
     *
     * @return 請求先担当者名
     */
    public String getBillingPersonName() {
        return billingPersonName;
    }

    /**
     * 請求先担当者名を設定します。
     *
     * @param billingPersonName 請求先担当者名
     */
    public void setBillingPersonName(String billingPersonName) {
        this.billingPersonName = billingPersonName;
    }

    /**
     * ボリューミンググループIDを返却します。
     *
     * @return ボリューミンググループID
     */
    public String getVolumingGroupId() {
        return volumingGroupId;
    }

    /**
     * ボリューミンググループIDを設定します。
     *
     * @param volumingGroupId ボリューミンググループID
     */
    public void setVolumingGroupId(String volumingGroupId) {
        this.volumingGroupId = volumingGroupId;
    }

    /**
     * 料金グループIDを返却します。
     *
     * @return 料金グループID
     */
    public String getPricingGroupId() {
        return pricingGroupId;
    }

    /**
     * 料金グループIDを設定します。
     *
     * @param pricingGroupId 料金グループID
     */
    public void setPricingGroupId(String pricingGroupId) {
        this.pricingGroupId = pricingGroupId;
    }

    /**
     * キャンペーングループリストを返却します。
     *
     * @return キャンペーングループリスト
     */
    public List<CampaignGroupBean> getCampaignGroupList() {
        return campaignGroupList;
    }

    /**
     * キャンペーングループリストを設定します。
     *
     * @param campaignGroupList キャンペーングループリスト
     */
    public void setCampaignGroupList(List<CampaignGroupBean> campaignGroupList) {
        this.campaignGroupList = campaignGroupList;
    }

    /**
     * 雑費グループを返却します。
     * @return 雑費グループ
     */
    public MiscellaneousExpensesGroupBean getMiscellaneousExpensesGroupBean() {
        return miscellaneousExpensesGroupBean;
    }

    /**
     * 雑費グループを設定します。
     * @param miscellaneousExpensesGroupBean 雑費グループ
     */
    public void setMiscellaneousExpensesGroupBean(MiscellaneousExpensesGroupBean miscellaneousExpensesGroupBean) {
        this.miscellaneousExpensesGroupBean = miscellaneousExpensesGroupBean;
    }

    /**
     * 税金グループを取得します。
     *
     * @return 税金グループ
     */
    public TaxGroupBean getTaxGroupBean() {
        return taxGroupBean;
    }

    /**
     * 税金グループを設定します。
     *
     * @param taxGroupBean 税金グループ
     */
    public void setTaxGroupBean(TaxGroupBean taxGroupBean) {
        this.taxGroupBean = taxGroupBean;
    }

    /**
     * クレジットリストを返却します。
     *
     * @return クレジットリスト
     */
    public List<CreditCouponBean> getCreditCouponList() {
        return creditCouponList;
    }

    /**
     * クレジットリストを設定します。
     *
     * @param creditCouponList クレジットリスト
     */
    public void setCreditCouponList(List<CreditCouponBean> creditCouponList) {
        this.creditCouponList = creditCouponList;
    }

    /**
     * 為替レートを返却します。
     *
     * @return 為替レート
     */
    public ExchangeRateBean getExchangeRateBean() {
        return exchangeRateBean;
    }

    /**
     * 為替レートを設定します。
     *
     * @param exchangeRateBean 為替レート
     */
    public void setExchangeRateBean(ExchangeRateBean exchangeRateBean) {
        this.exchangeRateBean = exchangeRateBean;
    }

    /**
     * ドル円を返却します。
     *
     * @return ドル円
     */
    @JsonIgnore
    public BigDecimal getDollerYen() {
        BigDecimal dollerYen = null;
        if (getExchangeRateBean() != null) {
            dollerYen = getExchangeRateBean().getDollerYen();
        }
        return dollerYen;
    }

    /**
     * 利用実績を返却します。
     *
     * @return 利用実績
     */
    public UsageHistoryBean getUsageHistoryBean() {
        return usageHistoryBean;
    }

    /**
     * 利用実績を設定します。
     *
     * @param usageHistoryBean 利用実績
     */
    public void setUsageHistoryBean(UsageHistoryBean usageHistoryBean) {
        this.usageHistoryBean = usageHistoryBean;
    }

    /**
     * APIIAMユーザを返却します。
     *
     * @return APIIAMユーザ
     */
    public IamUserBean getApiIamUser() {
        return apiIamUser;
    }

    /**
     * APIIAMユーザを設定します。
     *
     * @param apiIamUser APIIAMユーザ
     */
    public void setApiIamUser(IamUserBean apiIamUser) {
        this.apiIamUser = apiIamUser;
    }

    /**
     * 契約番号 を返却します。
     * @return contractNumber
     */
    public String getContractNumber() {
        return contractNumber;
    }

    /**
     * 契約番号 を設定します。
     * @param contractNumber 契約番号
     */
    public void setContractNumber(String contractNumber) {
        this.contractNumber = contractNumber;
    }

    /**
     * アカウント名プレフィックス を返却します。
     * @return アカウント名プレフィックス
     */
    public String getAccountNamePrefix() {
        return accountNamePrefix;
    }

    /**
     * アカウント名プレフィックス を設定します。
     * @param accountNamePrefix アカウント名プレフィックス
     */
    public void setAccountNamePrefix(String accountNamePrefix) {
        this.accountNamePrefix = accountNamePrefix;
    }

    /**
     * 用途 を返却します。
     * @return 用途
     */
    public String getUsage() {
        return usage;
    }

    /**
     * 用途 を設定します。
     * @param usage 用途
     */
    public void setUsage(String usage) {
        this.usage = usage;
    }

    /**
     * サプリセール を返却します。
     * @return サプリセール
     */
    public String getSubResale2() {
        return subResale2;
    }

    /**
     * サプリセール を設定します。
     * @param subResale2 サプリセール
     */
    public void setSubResale2(String subResale2) {
        this.subResale2 = subResale2;
    }

    /**
     * サポートプラン を返却します。
     * @return サポートプラン
     */
    public String getSupportPlan() {
        return supportPlan;
    }

    /**
     * サポートプラン を設定します。
     * @param supportPlan サポートプラン
     */
    public void setSupportPlan(String supportPlan) {
        this.supportPlan = supportPlan;
    }

    /**
     * 契約責任者ユーザ情報 を返却します。
     * @return 契約責任者ユーザ情報
     */
    public ContactBean getContractPersonBean() {
        return contractPersonBean;
    }

    /**
     * 契約責任者ユーザ情報 を設定します。
     * @param contractPersonBean 契約責任者ユーザ情報
     */
    public void setContractPersonBean(ContactBean contractPersonBean) {
        this.contractPersonBean = contractPersonBean;
    }

    /**
     * 契約責任者会社名 を返却します。
     * @return 契約責任者会社名
     */
    public String getContractPersonCompany() {
        return contractPersonCompany;
    }

    /**
     * 契約責任者会社名 を設定します。
     * @param contractPersonCompany 契約責任者会社名
     */
    public void setContractPersonCompany(String contractPersonCompany) {
        this.contractPersonCompany = contractPersonCompany;
    }

    /**
     * 問合せ担当者ユーザ情報 を返却します。
     * @return 問合せ担当者ユーザ情報
     */
    public ContactBean getContactPersonBean() {
        return contactPersonBean;
    }

    /**
     * 問合せ担当者ユーザ情報 を設定します。
     * @param contactPersonBean 問合せ担当者ユーザ情報
     */
    public void setContactPersonBean(ContactBean contactPersonBean) {
        this.contactPersonBean = contactPersonBean;
    }

    /**
     * 問合せ担当者会社名 を返却します。
     * @return 問合せ担当者会社名
     */
    public String getContactPersonCompany() {
        return contactPersonCompany;
    }

    /**
     * 問合せ担当者会社名 を設定します。
     * @param contactPersonCompany 問合せ担当者会社名
     */
    public void setContactPersonCompany(String contactPersonCompany) {
        this.contactPersonCompany = contactPersonCompany;
    }

    /**
     * 請求明細送付先ユーザ情報 を返却します。
     * @return 請求明細送付先ユーザ情報
     */
    public ContactBean getBillingPersonBean() {
        return billingPersonBean;
    }

    /**
     * 請求明細送付先ユーザ情報 を設定します。
     * @param billingPersonBean 請求明細送付先ユーザ情報
     */
    public void setBillingPersonBean(ContactBean billingPersonBean) {
        this.billingPersonBean = billingPersonBean;
    }

    /**
     * 為替レート を返却します。
     * @return 為替レート
     */
    public String getFixedRate() {
        return fixedRate;
    }

    /**
     * 為替レート を設定します。
     * @param fixedRate 為替レート
     */
    public void setFixedRate(String fixedRate) {
        this.fixedRate = fixedRate;
    }

    /**
     * その他連絡先リスト を返却します。
     * @return その他連絡先リスト
     */
    public List<OtherContactBean> getOtherContact() {
        return otherContact;
    }

    /**
     * その他連絡先リスト を設定します。
     * @param otherContact その他連絡先リスト
     */
    public void setOtherContact(List<OtherContactBean> otherContact) {
        this.otherContact = otherContact;
    }

    /**
     * CloudTrail利用フラグ を返却します。
     * @return CloudTrail利用フラグ
     */
    public boolean isAwsCloudTrail() {
        return awsCloudTrail;
    }

    /**
     * CloudTrail利用フラグ を設定します。
     * @param awsCloudTrail CloudTrail利用フラグ
     */
    public void setAwsCloudTrail(boolean awsCloudTrail) {
        this.awsCloudTrail = awsCloudTrail;
    }

    /**
     * RootアカウントMFA利用フラグ を返却します。
     * @return RootアカウントMFA利用フラグ
     */
    public boolean isRootMFA() {
        return rootMFA;
    }

    /**
     * RootアカウントMFA利用フラグ を設定します。
     * @param rootMFA RootアカウントMFA利用フラグ
     */
    public void setRootMFA(boolean rootMFA) {
        this.rootMFA = rootMFA;
    }

    /**
     * TrustedAdvisorセキュリティ監査利用フラグ を返却します。
     * @return TrustedAdvisorセキュリティ監査利用フラグ
     */
    public boolean isTrustedAdvisorSecurityCheck() {
        return trustedAdvisorSecurityCheck;
    }

    /**
     * TrustedAdvisorセキュリティ監査利用フラグ を設定します。
     * @param trustedAdvisorSecurityCheck TrustedAdvisorセキュリティ監査利用フラグ
     */
    public void setTrustedAdvisorSecurityCheck(boolean trustedAdvisorSecurityCheck) {
        this.trustedAdvisorSecurityCheck = trustedAdvisorSecurityCheck;
    }

    /**
     * VPCフローログ利用フラグ を返却します。
     * @return VPCフローログ利用フラグ
     */
    public boolean isVpcFlowLogs() {
        return vpcFlowLogs;
    }

    /**
     * VPCフローログ利用フラグ を設定します。
     * @param vpcFlowLogs VPCフローログ利用フラグ
     */
    public void setVpcFlowLogs(boolean vpcFlowLogs) {
        this.vpcFlowLogs = vpcFlowLogs;
    }

    /**
     * AWSConfig利用フラグ を返却します。
     * @return AWSConfig利用フラグ
     */
    public boolean isAwsConfig() {
        return awsConfig;
    }

    /**
     * AWSConfig利用フラグ を設定します。
     * @param awsConfig AWSConfig利用フラグ
     */
    public void setAwsConfig(boolean awsConfig) {
        this.awsConfig = awsConfig;
    }

    /**
     * 要Excel明細 を返却します。
     * @return 要Excel明細
     */
    public boolean isNeedExcelBilling() {
        return needExcelBilling;
    }

    /**
     * 要Excel明細 を設定します。
     * @param needExcelBilling 要Excel明細
     */
    public void setNeedExcelBilling(boolean needExcelBilling) {
        this.needExcelBilling = needExcelBilling;
    }

    /**
     * 料金グループ料金名 を返却します。
     * @return 料金グループ料金名
     */
    public String getPricingGroupName() {
        return pricingGroupName;
    }

    /**
     * 料金グループ料金名 を設定します。
     * @param pricingGroupName 料金グループ料金名
     */
    public void setPricingGroupName(String pricingGroupName) {
        this.pricingGroupName = pricingGroupName;
    }

    /**
     * 契約開始日 を返却します。
     * @return 契約開始日
     */
    public ZonedDateTime getStartDate() {
        return startDate;
    }

    /**
     * 契約開始日 を設定します。
     * @param startDate 契約開始日
     */
    public void setStartDate(ZonedDateTime startDate) {
        this.startDate = startDate;
    }

    /**
     * 解約日 を返却します。
     * @return 解約日
     */
    public ZonedDateTime getCancelDate() {
        return cancelDate;
    }

    /**
     * 解約日 を設定します。
     * @param cancelDate 解約日
     */
    public void setCancelDate(ZonedDateTime cancelDate) {
        this.cancelDate = cancelDate;
    }

    /**
     * APIIAMユーザを除外した文字列表現を返却します。
     */
    @Override
    public String toString() {
        return new ReflectionToStringBuilder(this).setExcludeFieldNames(new String[] { "apiIamUser" }).toString();
    }
}
